/*
 Автор: Швейкин Евгений Юрьевич

 Функциональное описание:     
    Модуль выполняет арбитраж модулей формирования импульсов. 
    Значения из памяти считываются блоками по 16 слов.
    Каждый блок соответствует своему модулю формирования.
    
    
    адрес   Данные
    0       задержка до первого импульса
    1       аза (смещение фронта 1)
    2       период
    3       длительность 1
    4       количество импульсов
    5-16    резерв
*/
//--------------------------------------------------------------------------------------------------
// ********************** МАКРОСЫ ******************************************************************

    
// *********************** НАЧАЛО МОДУЛЯ ***********************************************************
module mod_arbiter_imp_gen
    #(  parameter ch_num = 8
    )
    (   input  logic                        clk,
        
        output logic [31:0]                 addr,
        output logic [ch_num - 1:0]         wre
    );
 
//  ********************* КОНСТАНТЫ ****************************************************************
  localparam wl_p = $clog2(ch_num);
  
//  ********************* ФУНКЦИИ ******************************************************************

//  ********************* ТИПЫ ДАННЫХ **************************************************************

// ********************** ПЕРЕМЕННЫЕ ***************************************************************
    logic [3:0]             ch_wre;

// ********************* ИНИЦИАЛИЗАЦИЯ ПЕРЕМЕННЫХ ДЛЯ СИМУЛЯТОРА ***********************************
  
    initial addr    = 0;
    initial ch_wre  = 0;
//  ********************* ASSIGN *******************************************************************

// ********************* ПОДКЛЮЧАЕМЫЕ МОДУЛИ *******************************************************

    
// ********************* ПРОЦЕССЫ ******************************************************************
    always_comb
    begin
        wre                 = {ch_num{1'b0}};
        wre[addr[wl_p+3:4]] = 1'b1;
    end
    
    always_ff @(posedge clk)
    begin
        addr    <= addr + 32'd1;
        
        // if (addr[3:0] == 4'b1111) begin
            // if (ch_wre < ch_num - 1)
                // ch_wre  <= ch_wre + 4'd1;
            // else
                // ch_wre  <= 4'd0;
        // end
        // else;
    end

endmodule 